#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/wait.h>
#include<sys/types.h>

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        int cnt = 5;
        while(1)
        {
            printf("I am a child process! PID : %d\n",getpid());
            sleep(1);
            cnt--;
            if(!cnt)
                break;
        }
        exit(17);
    }
    else 
    {
        // 基于非阻塞的轮询等待方案
        int status = 0;
        while(1)
        {
            pid_t ret = waitpid(-1,&status,WNOHANG);
            if(ret > 0)
            {
                printf("wait success : %d,exit sign : %d,exit code : %d\n",ret,status&0x7F,(status>>8)&0xFF);
                break;
            }
            else if(ret == 0)
            {
                // 等待成功，但子进程还未退出
                printf("父进程做其它事情！\n");
                sleep(1);
            }
            else{
                // error
            }
        }

       // int status = 0;
       // printf("I am a parent process! PID : %d,Prepare to wait for the child process.\n");
       // pid_t ret = waitpid(id,&status,0);
       // if(ret > 0)
       // {
       //     if(WIFEXITED(status))
       //     {
       //         printf("Child process exit normally,exit code : %d\n",WEXITSTATUS(status));
       //     }
       // }

       // if(ret > 0)
       // {
       //     printf("wait success,ret = %d,The exit code of the child process I'm waiting for : %d,The child exit signal is : %d\n",ret,(status>>8)&0xFF,status&0x7F); // status右移8位不会影响status的值，status>>=8位才影响status的值 
       // }
    }
    return 0;
}



//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        while(1)
//        {
//            printf("I am a child process! PID : %d\n",getpid());
//            sleep(1);
//        }
//    }
//    else 
//    {
//        printf("I am a parent process! PID : %d,Prepare to wait for the child process.\n");
//        sleep(40);
//        pid_t ret = wait(NULL);
//        if(ret < 0)
//            printf("wait false!\n");
//        else 
//            printf("wait success!\n");
//        sleep(20);
//    }
//    return 0;
//}


//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        printf("I am a child process!PID : %d,PPID : %d\n",getpid(),getppid());
//        sleep(1);
//    }
//    else 
//    {
//
//        printf("I am a parent process!PID : %d,PPID : %d\n",getpid(),getppid());
//        sleep(1);
//    }
//    return 0;
//}
